package com.dic.common.base.dao;

import java.util.List;
import java.util.Map;

import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.Root;

import com.dic.common.utils.helper.Pager;
import org.hibernate.criterion.Order;


public interface IBaseDao{

	/**
	 * 
	 * @return
	 */
	public CriteriaBuilder getCriteriaBuilder();
	
	/**
	 * 保存实体
	 * @param entity
	 */
	public boolean save(Object entity);
	
	/**
	 * 更新实体
	 * @param entity
	 */
	public boolean update(Object entity);
	
	/**
	 * 删除实体
	 * @param entity
	 * @return
	 */
	public boolean delete(Object entity);
	
	/**
	 * 根据id查询实体
	 * @param objClass
	 * @param id
	 * @return
	 */
	public <T> T getEntityById(Class<T> objClass, String id);
	
	/**
	 * 查询所有实体
	 * @param objClass 实体类
	 * @param order 排序 如：Order.desc("createTime")  org.hibernate.criterion.Order;
	 * @return
	 */
	public <T> List<T> queryAll(Class<T> objClass, Order order);
	
	/**
	 * 查询实体集合
	 * @param criteriaQuery 建立查询
	 * @param root 查询对象
	 * @param predicates 查询条件
	 * @param order 排序
	 * @return 实体集合
	 */
	public <T> List<T> queryEntity(CriteriaQuery<T> criteriaQuery, Root<T> root, List<Predicate> predicates, Order order);
	
	/**
	 * 分页查询
	 * @param page 开始页
	 * @param rows 每页大小
	 * @param criteriaQuery 建立查询
	 * @param root 查询对象
	 * @param predicates 查询条件
	 * @param order 排序
	 * @param objClass 查询实体
	 * @return
	 */
	public <T> Pager<T> queryPage(int page, int rows, CriteriaQuery<T> criteriaQuery, Root<T> root, List<Predicate> predicates, Order order, Class<T> objClass);
	
	/**
	 * HQL查询集合
	 * @param HQL 查询语句
	 * @param attributeMap 查询条件
	 * @param objClass 查询实体
	 * @return
	 */
	public <T> List<T> queryHQL(String HQL, Map<String, String> attributeMap, Class<T> objClass);
	
	/**
	 * HQL分页查询
	 * @param page 开始页 
	 * @param rows 每页大小
	 * @param HQL 查询语句
	 * @param attributeMap 查询条件
	 * @param objClass 查询实体
	 * @return
	 */
	public <T> Pager<T> queryHQLPage(int page, int rows, String HQL, Map<String, String> attributeMap, Class<T> objClass);
	
	/**
	 * sql查询集合
	 * @param SQL sql语句
	 * @param attributeList 查询条件
	 * @param objClass 查询实体
	 * @return
	 */
	public <T> List<T> querySQL(String SQL, List<Object> attributeList, Class<T> objClass);
	
	public <T> List<T> querySQL(String SQL, Map<String, String> attributeMap, Class<T> objClass);
	
	/**
	 * sql分页查询集合
	 * @param page 开始页
	 * @param rows 每页大小
	 * @param SQL sql语句
	 * @param attributeList 查询条件
	 * @param objClass 查询实体
	 * @return
	 */
	public <T>Pager<T> querySQLPage(int page, int rows, String SQL, List<Object> attributeList, Class<T> objClass);
	
	public <T>Pager<T> querySQLPage(int page, int rows, String SQL, Map<String, String> attributeMap, Class<T> objClass);

	/**
	 * HQL语句执行
	 * @param HQL
	 * @param attributeList 条件
	 * @return
	 */
	public int executeHQL(String HQL, List<Object> attributeList);
	
	public int executeHQL(String HQL, Map<String, String> attributeMap);
	
	/**
	 * sql查询返回List对象集合
	 * @param SQL
	 * @return
	 */
	public List<Object[]> queryBySql(String SQL);
	
	/**
	 * sql查询返回Map对象集合
	 * @param SQL
	 * @return
	 */
	public List<Map<String,Object>> queryBySqlM(String SQL);
	
	/**
	 * 执行sql语句
	 * @param SQL
	 * @param attributeList 条件
	 * @return
	 */
	public int executeSql(String SQL, List<Object> attributeList);
	
	public int executeSql(String SQL, Map<String, String> attributeMap);
	
}
